package com.hong.service_user.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;

import com.hong.fy_common_commomutil.common.exception.FyException;
import com.hong.fy_common_commomutil.common.helper.JwtHelper;
import com.hong.fy_common_commomutil.common.result.Result;
import com.hong.fy_common_commomutil.common.result.ResultCodeEnum;
import com.hong.fy_model.model.cart.CartEntity;
import com.hong.fy_model.model.user.UserEntity;
import com.hong.fy_model.vo.user.LoginVo;
import com.hong.service_cart_client.CartFeignClient;
import com.hong.service_user.service.UserService;
import com.hong.service_user.mapper.UserMapper;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import java.util.HashMap;
import java.util.Map;


@Service("userService")
public class UserServiceImpl extends ServiceImpl<UserMapper, UserEntity> implements UserService {

    @Autowired
    private RedisTemplate<String,String> redisTemplate;

    @Autowired
    private CartFeignClient cartFeignClient;



    @Override
    public boolean register(UserEntity user) {
        //根据电话号码判断用户名是否存在
        UserEntity userEntity = this.getOne(new QueryWrapper<UserEntity>().eq("phone", user.getPhone()));
        if(userEntity != null){
            return false;
        }
        boolean b = this.save(user);
        if(b) {
            //获得用户自增的ID
            Integer userId = user.getUserId();
//        System.out.println("userId:"+userId);
            //调用Feign的方法，为用户创建一个购物车
            CartEntity cart = cartFeignClient.add(userId);
//        System.out.println("cart"+cart);
            //如果创建购物车成功，将购物车ID存入用户表
            if (cart != null){
                user.setCartId(cart.getCartId());
                boolean flag = this.updateById(user);
                return flag;
            }
        }
        return false;


    }


    @Override
    public Map<String, Object> loginByPwd(LoginVo loginVo) {
        String name = loginVo.getName();
        String pwd = loginVo.getPassword();
        Map<String, Object> map = new HashMap<>();
        //校验参数
        if(StringUtils.isEmpty(name) || StringUtils.isEmpty(pwd)) {  //判断账号和密码是否为空
            throw new FyException(ResultCodeEnum.PARAM_ERROR);  //抛出异常
        }


        QueryWrapper<UserEntity> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("name", name)
                .eq("password", pwd);
        //获取用户
        UserEntity user = baseMapper.selectOne(queryWrapper);

        if(null == user) { //如果用户不存在,则返回用户不存在
            map.put("code", ResultCodeEnum.USER_NOT_EXIST.getCode());
            map.put("msg", ResultCodeEnum.USER_NOT_EXIST.getMessage());
            return map;
        }

        //TODO 记录登录

        //返回页面显示名称
        String userName = user.getName();
        if(StringUtils.isEmpty(userName)) {
            userName = user.getNickName();
        }
        if(StringUtils.isEmpty(userName)) { //如果昵称为空,则使用手机号返回
            userName = user.getPhone();
        }
        String token = JwtHelper.createToken(user.getUserId(), userName); //生成token
        map.put("token",token);
        map.put("name", userName);
        return map;
    }

    @Override
    public Map<String, Object> loginByPhone(LoginVo loginVo) {
        //从loginVo获取输入的手机号，和验证码
        String phone = loginVo.getPhone();
        String code = loginVo.getCode();

        //判断手机号和验证码是否为空
        if(StringUtils.isEmpty(phone) || StringUtils.isEmpty(code)) {
            throw new FyException(ResultCodeEnum.PARAM_ERROR);
        }

//        //判断手机验证码和输入的验证码是否一致
//        String redisCode = redisTemplate.opsForValue().get(phone);
//        if(!code.equals(redisCode)) {
//            throw new FyException(ResultCodeEnum.CODE_ERROR);
//        }

        //绑定手机号码
        UserEntity userEntity = null;
//        if(!StringUtils.isEmpty(loginVo.getOpenid())) {
//            userEntity = this.selectWxInfoOpenId(loginVo.getOpenid());
//            if(null != userEntity) {
//                userEntity.setPhone(loginVo.getPhone());
//                this.updateById(userEntity);
//            } else {
//                throw new FyException(ResultCodeEnum.DATA_ERROR);
//            }
//        }

        //如果userinfo为空，进行正常手机登录
//        if(userEntity == null) {
            //判断是否第一次登录：根据手机号查询数据库，如果不存在相同手机号就是第一次登录
            QueryWrapper<UserEntity> wrapper = new QueryWrapper<>();
            wrapper.eq("phone",phone);
            userEntity = baseMapper.selectOne(wrapper);
            if(userEntity == null) { //第一次使用这个手机号登录
                //自动为用户注册
                userEntity = new UserEntity();
                userEntity.setPhone(phone);
                register(userEntity);
            }
//        }

        //校验是否被禁用
        if(userEntity.getStatus() == 0) {
            throw new FyException(ResultCodeEnum.LOGIN_DISABLED_ERROR);
        }


        //不是第一次，直接登录
        //返回登录信息
        //返回登录用户名
        //返回token信息
        Map<String, Object> map = new HashMap<>();
        String name = userEntity.getName();
        if(StringUtils.isEmpty(name)) { //如果姓名为空，则用昵称返回
            name = userEntity.getNickName();
        }
        if(StringUtils.isEmpty(name)) { //如果昵称为空，则用手机号返回
            name = userEntity.getPhone();
        }
        map.put("name",name);
        //jwt生成token字符串
        String token = JwtHelper.createToken(userEntity.getUserId(), name);
        map.put("token",token);
        return map;
    }

}
